package com.fzy.common.validator;

import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 检验工具类
 *
 * @author 冯赵杨
 * @create 2018/8/31
 */
public class ValidatorUtil {
    private ValidatorUtil() {
    }

    /**
     * 数字正则
     */
    private static final String NUMBER_PATTERN = "[0-9]*";

    /**
     * 邮件正则
     */
    private static final String EMAIL_PATTERN = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";

    /**
     * 电话号码正则
     */
    private static final String TEL_PATTERN = "\\d{4}-\\d{8}|\\d{4}-\\d{7}|\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{8}|\\d{7}";

    /**
     * 手机正则
     */
    private static final String MOBILE_PATTERN = "^[1][3,5,7,8]+\\d{9}";

    /**
     * 中文正则
     */
    private static final String CHINESE_NAME_PATTERN = "^[\u4e00-\u9fa5]+$";

    /**
     * HTML标签正则
     */
    private static final String HTML_TAG_PATTERN = "<(\\S*?)[^>]*>.*?</\\1>|<.*? />";

    /**
     * URL正则
     */
    private static final String URL_PATTERN = "[a-zA-z]+://[^\\s]*";

    /**
     * IP正则
     */
    private static final String IP_PATTERN = "\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}";

    /**
     * ID正则
     */
    private static final String ID_PATTERN = "[a-zA-Z][a-zA-Z0-9_]{4,15}$";

    /**
     * 邮编正则
     */
    private static final String POST_CODE_PATTERN = "[1-9]\\d{5}(?!\\d)";

    /**
     * 是否含有/正则
     */
    private static final String IS_ORGAN_PATH_REGEX = "^(?!/)(?!.*?/$)[a-z0-9A-Z\u4e00-\u9fa5/]+$";

    /**
     * 特殊符号正则
     */
    private static final Pattern SPECIAL_CHAR_PATTERN = Pattern.compile("[`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]");

    /**
     * 数字和字母正则
     */
    private static final String IS_LETTER_NUMBER = "^[a-z0-9A-Z]+$";


    /**
     * 检查输入的是否是数字
     *
     * @param value
     * @return boolean
     */
    public static boolean isNumber(String value) {
        return value.matches(NUMBER_PATTERN);
    }

    /**
     * 检查email输入是否正确
     * 正确的书写格式为 username@domain
     *
     * @param value
     * @return boolean
     */
    public static boolean isEmail(String value, int length) {
        return value.matches(EMAIL_PATTERN) && value.length() <= length;
    }

    /**
     * 检查电话输入是否正确
     * 正确格式 012-87654321、0123-87654321、0123－7654321、87025761、7013015
     *
     * @param value
     * @return boolean
     */
    public static boolean isTel(String value) {
        return value.matches(TEL_PATTERN);
    }

    /**
     * 检查手机输入是否正确
     *
     * @param value
     * @return boolean
     */
    public static boolean isMobile(String value) {
        return value.matches(MOBILE_PATTERN);
    }

    /**
     * 检查中文名输入是否正确
     *
     * @param value
     * @return boolean
     */
    public static boolean isChineseName(String value, int length) {
        return value.matches(CHINESE_NAME_PATTERN) && value.length() <= length;
    }


    /**
     * 检查字符串是否含有HTML标签
     *
     * @param value
     * @return boolean
     */

    public static boolean isHtmlTag(String value) {
        return value.matches(HTML_TAG_PATTERN);
    }

    /**
     * 检查URL是否合法
     *
     * @param value
     * @return boolean
     */
    public static boolean isURL(String value) {
        return value.matches(URL_PATTERN);
    }

    /**
     * 检查IP是否合法
     *
     * @param value
     * @return boolean
     */
    public static boolean isP(String value) {
        return value.matches(IP_PATTERN);
    }

    /**
     * 检查ID是否合法，开头必须是大小写字母，其他位可以有大小写字符、数字、下划线
     *
     * @param value
     * @return boolean
     */
    public static boolean isID(String value) {
        return value.matches(ID_PATTERN);
    }


    /**
     * 检查邮编是否合法
     *
     * @param value
     * @return boolean
     */
    public static boolean isPostCode(String value) {
        return value.matches(POST_CODE_PATTERN);
    }


    /**
     * 检查输入是否超出规定长度
     *
     * @param value
     * @param length
     * @return boolean
     */
    public static boolean checkLength(String value, int length) {
        return ((value == null || "".equals(value.trim())) ? 0 : value.length()) <= length;
    }

    /**
     * 判断几位小数(正数)
     *
     * @param decimal 数字
     * @param count   小数位数
     * @return boolean true,通过，false，没通过
     */
    public static boolean isDecimal(String decimal, int count) {
        String regex = "^(-)?(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){" + count
                + "})?$";
        return decimal.matches(regex);
    }


    /**
     * 判断是否含有特殊字符
     *
     * @param str
     */
    public static boolean hasSpecialChar(String str) {
        Matcher m = SPECIAL_CHAR_PATTERN.matcher(str);
        return m.find();
    }


    /**
     * 检查输入的日期格式是否正确，如："yyyy-mm-dd"
     *
     * @param value
     * @param pattern
     * @return boolean
     */
    public static boolean isDate(String value, String pattern) {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
            dateFormat.parse(value);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 检查输入的字符是否是 "是"，"否"
     *
     * @param value
     * @return
     */
    public static boolean isYesOrNo(String value) {
        return "是".equals(value) || "否".equals(value);
    }

    /**
     * 检查字符串的真实长度是否和指定的长度相同。
     *
     * @return boolean
     */
    public static boolean checkStringLength(String value, int length) {
        int len = value.getBytes().length;
        return len <= length;
    }


    /**
     * 校验导入组织信息是否符合要求
     */
    public static boolean isOrganPath(String str) {
        return str.matches(IS_ORGAN_PATH_REGEX);
    }


    /**
     * 检验是否是数字和字母组合
     *
     * @param str
     * @return
     */
    public static boolean isLetterNumber(String str) {
        return str.matches(IS_LETTER_NUMBER);
    }


}
